import { Controller, Get, Put, Delete, Param, Body, UnauthorizedException, Req, Query, Post } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto, UpdateUserDto, UserResponseDto } from '../../dto/user.dto';
import { Admin } from '../../common/decorators/admin.decorator';
import { ApiTags, ApiOperation, ApiResponse, ApiBody, ApiParam, ApiQuery } from '@nestjs/swagger';
import { User } from '../../entities/user.entity';
import { PaginationQueryDto, PaginationResponseDto } from '../../dto/pagination.dto';

@ApiTags('用户管理')
@Controller('api/admin/users')
export class UserAdminController {
  constructor(private readonly userService: UserService) {}

    @Admin()
    @Get('me')
    @ApiOperation({
      summary: '获取当前用户信息',
      description: '根据登录状态获取当前用户的详细信息',
    })
    @ApiResponse({
      status: 200,
      description: '获取成功',
      type: User,
    })
    @ApiResponse({
      status: 401,
      description: '用户未登录',
    })
    getProfile(@Req() req: Request): Promise<User> {
      const user = (req as any).user as User;
      if (!user) {
        throw new UnauthorizedException('用户未登录');
      }
      return this.userService.getProfile(user.id);
    }

    
  @Get()
  @Admin()
  @ApiOperation({
    summary: '分页获取用户列表',
    description: '只有管理员才能访问，支持分页和关键词搜索',
  })
  @ApiQuery({
    name: 'page',
    description: '页码，默认为1',
    required: false,
  })
  @ApiQuery({
    name: 'pageSize',
    description: '每页数量，默认为10',
    required: false,
  })
  @ApiQuery({
    name: 'keyword',
    description: '搜索关键词，用于搜索用户名或邮箱',
    required: false,
  })
  @ApiResponse({
    status: 200,
    description: '获取成功',
    // Swagger不直接支持泛型，所以这里使用any类型
    type: Object,
  })
  @ApiResponse({
    status: 403,
    description: '权限不足，需要管理员权限',
  })
  async findAll(@Query() query: PaginationQueryDto): Promise<PaginationResponseDto<UserResponseDto>> {
    // 设置默认值
    console.log("查询:" , query);
    const page = query.page || 1;
    const pageSize = query.pageSize || 10;
    const keyword = query.keyword;
    
    // 调用服务层方法获取分页数据
    const result = await this.userService.findAll(page, pageSize, keyword);
    
    // 构造并返回分页响应DTO
    return new PaginationResponseDto<UserResponseDto>(
      result.data,
      result.total,
      page,
      pageSize
    );
  }

  @Get(':id')
  @Admin()
  @ApiOperation({
    summary: '获取指定用户（管理员）',
    description: '管理员可以获取任意用户的详细信息',
  })
  @ApiParam({
    name: 'id',
    description: '用户ID',
    example: '1',
  })
  @ApiResponse({
    status: 200,
    description: '获取成功',
    type: UserResponseDto,
  })
  @ApiResponse({
    status: 403,
    description: '权限不足，需要管理员权限',
  })
  @ApiResponse({
    status: 404,
    description: '用户不存在',
  })
  findOne(@Param('id') id: string): Promise<UserResponseDto> {
    return this.userService.findOne(+id);
  }


  @Put('role/:id')
  @Admin()
  @ApiOperation({
    summary: '更新用户角色',
    description: '管理员更新用户的角色权限',
  })
  @ApiParam({
    name: 'id',
    description: '用户ID',
    example: '1',
  })
  @ApiBody({
    schema: {
      example: {
        role: 1, // 0普通用户，1管理员
      },
    },
  })
  @ApiResponse({
    status: 200,
    description: '更新成功',
    type: UserResponseDto,
  })
  @ApiResponse({
    status: 403,
    description: '权限不足，需要管理员权限',
  })
  @ApiResponse({
    status: 404,
    description: '用户不存在',
  })
  updateRole(@Param('id') id: string, @Body('role') role: number): Promise<UserResponseDto> {
    return this.userService.updateRole(+id, role);
  }

  @Put('status/:id')
  @Admin()
  @ApiOperation({
    summary: '更新用户状态',
    description: '管理员更新用户的启用/禁用状态',
  })
  @ApiParam({
    name: 'id',
    description: '用户ID',
    example: '1',
  })
  @ApiBody({
    schema: {
      example: {
        isActive: true, // true启用，false禁用
      },
    },
  })
  @ApiResponse({
    status: 200,
    description: '更新成功',
    type: UserResponseDto,
  })
  @ApiResponse({
    status: 403,
    description: '权限不足，需要管理员权限',
  })
  @ApiResponse({
    status: 404,
    description: '用户不存在',
  })
  updateUserStatus(@Param('id') id: string, @Body('status') status: number): Promise<UserResponseDto> {
    console.log("更新用户状态参数:", id, status);
    return this.userService.updateUserStatus(+id, status);
  }

  

  @Put(':id')
  @Admin()
  @ApiOperation({
    summary: '更新用户信息（管理员）',
    description: '管理员可以更新任意用户的个人信息',
  })
  @ApiParam({
    name: 'id',
    description: '用户ID',
    example: '1',
  })
  @ApiBody({
    type: UpdateUserDto,
    description: '更新的用户信息',
  })
  @ApiResponse({
    status: 200,
    description: '更新成功',
    type: UserResponseDto,
  })
  @ApiResponse({
    status: 403,
    description: '权限不足，需要管理员权限',
  })
  @ApiResponse({
    status: 404,
    description: '用户不存在',
  })
  update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto): Promise<UserResponseDto> {
    return this.userService.update(+id, updateUserDto);
  }

  @Delete(':id')
  @Admin()
  @ApiOperation({
    summary: '删除用户',
    description: '管理员删除指定用户',
  })
  @ApiParam({
    name: 'id',
    description: '用户ID',
    example: '1',
  })
  @ApiResponse({
    status: 200,
    description: '删除成功',
  })
  @ApiResponse({
    status: 403,
    description: '权限不足，需要管理员权限',
  })
  @ApiResponse({
    status: 404,
    description: '用户不存在',
  })
  remove(@Param('id') id: string): Promise<UserResponseDto> {
    return this.userService.remove(+id);
  }

  //这里加入一个添加用户的接口
  @Post()
  @Admin()
  @ApiOperation({
    summary: '添加用户',
    description: '管理员添加新用户',
  })
  @ApiBody({
    type: CreateUserDto,
    description: '新用户信息',
  })
  @ApiResponse({
    status: 201,
    description: '用户创建成功',
    type: UserResponseDto,
  })
  @ApiResponse({
    status: 403,
    description: '权限不足，需要管理员权限',
  })
  create(@Body() createUserDto: CreateUserDto): Promise<UserResponseDto> {
    return this.userService.create(createUserDto);
  }

}